package com.munichosica.myapp.jdbc;

import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;



import com.munichosica.myapp.dao.ArchivoDao;
import com.munichosica.myapp.dto.Archivo;
import com.munichosica.myapp.exceptions.ArchivoDaoException;

public class ArchivoDaoImpl implements ArchivoDao{
	private StringBuilder sql=null;
	
	public ArchivoDaoImpl() {
		sql=new StringBuilder();
	}
	
	@Override
	public void insertar(Archivo archivo) throws ArchivoDaoException {
		sql.append("INSERT INTO ARCHIVO (arcnombre_v, arcblob_b,arcextension_c, arcestado_c, arcusuarioregistra_v, arcfecharegistra_f, arcip_v) " +
				"VALUES (?,?,?,'A',?,CURDATE(),?)");
		
		Connection conn=null;
		PreparedStatement stmt=null;
		ResultSet rs=null;
		try {
			conn=ResourceManager.getConnection();
			stmt=conn.prepareStatement(sql.toString(),PreparedStatement.RETURN_GENERATED_KEYS);
			stmt.setString(1, archivo.getArcnombreV());
			stmt.setBytes(2, archivo.getArcblobB());
			stmt.setString(3, archivo.getArcextensionC());
			stmt.setString(4, archivo.getArcusuarioregistraV());
			stmt.setString(5, archivo.getArcipV());
			int results=stmt.executeUpdate();
			if(results>0){
				rs=stmt.getGeneratedKeys();
				if(rs.next()){
					archivo.setArccodigoI(rs.getInt(1));
				}
			}
		} catch (SQLException e) {
			throw new ArchivoDaoException(e.getMessage(),e);
		} finally{
			ResourceManager.close(rs);
			ResourceManager.close(stmt);
			ResourceManager.close(conn);
		}
	}

	@Override
	public void modificar(Archivo archivo) throws ArchivoDaoException {
		sql.append("UPDATE ARCHIVO " +
				"SET ARCNOMBRE_V=?, " +
				"ARCBLOB_B=?, " +
				"ARCEXTENSION_C=?, " +
				"ARCUSUARIOACTUALIZA_V=?, " +
				"ARCFECHAACTUALIZA_F=CURDATE(), " +
				"ARCIP_V=? " +
				"WHERE ARCCODIGO_I=?");
		Connection conn=null;
		PreparedStatement stmt=null;
		try {
			conn=ResourceManager.getConnection();
			stmt=conn.prepareStatement(sql.toString());
			stmt.setString(1, archivo.getArcnombreV());
			stmt.setBytes(2, archivo.getArcblobB());
			stmt.setString(3, archivo.getArcextensionC());
			stmt.setString(4, archivo.getArcusuarioactualizaV());
			stmt.setString(5, archivo.getArcipV());
			stmt.setInt(6, archivo.getArccodigoI());
			stmt.executeUpdate();
		} catch (SQLException e) {
			throw new ArchivoDaoException(e.getMessage(),e);
		} finally{
			ResourceManager.close(stmt);
			ResourceManager.close(conn);
		}
	}

	@Override
	public void eliminar(Archivo archivo) throws ArchivoDaoException {
		sql.append("UPDATE ARCHIVO " +
				"SET ARCESTADO_C='I', " +
				"ARCUSUARIOACTUALIZA_V=?, " +
				"ARCFECHAACTUALIZA_F=CURDATE(), " +
				"ARCIP_V=? " +
				"WHERE ARCCODIGO_I=?");
		Connection conn=null;
		PreparedStatement stmt=null;
		try {
			conn=ResourceManager.getConnection();
			stmt=conn.prepareStatement(sql.toString());
			stmt.setString(1, archivo.getArcusuarioactualizaV());
			stmt.setString(2, archivo.getArcipV());
			stmt.setInt(3, archivo.getArccodigoI());
			stmt.executeUpdate();
		} catch (SQLException e) {
			throw new ArchivoDaoException(e.getMessage(),e);
		} finally{
			ResourceManager.close(stmt);
			ResourceManager.close(conn);
		}
	}

	@Override
	public Archivo obtener(Integer codigo) throws ArchivoDaoException {
		sql.append("SELECT ARCCODIGO_I AS CODIGO, " +
				"ARCNOMBRE_V AS NOMBRE, " +
				"ARCBLOB_B AS ARCHIVO, " +
				"ARCEXTENSION_C AS EXTENSION, " +
				"ARCESTADO_C AS ESTADO " +
				"FROM ARCHIVO " +
				"WHERE ARCCODIGO_I=?");
		Archivo archivo=null;
		Connection conn=null;
		PreparedStatement stmt=null;
		ResultSet rs=null;
		try {
			conn=ResourceManager.getConnection();
			stmt=conn.prepareStatement(sql.toString());
			stmt.setInt(1, codigo);
			boolean results=stmt.execute();
			if(results){
				rs=stmt.getResultSet();
				if(rs.next()){
					archivo=new Archivo();
					archivo.setArccodigoI(rs.getInt("CODIGO"));
					archivo.setArcnombreV(rs.getString("NOMBRE"));
					archivo.setArcblobB(rs.getBytes("ARCHIVO"));
					archivo.setArcextensionC(rs.getString("EXTENSION"));
					archivo.setArcestadoC(rs.getString("ESTADO"));
				}
			}
		} catch (SQLException e) {
			throw new ArchivoDaoException(e.getMessage(),e);
		} finally{
			ResourceManager.close(stmt);
			ResourceManager.close(conn);
		}
		return archivo;
	}

}
